﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace Modelo.Seguridad
{
    public class CatalogoPerfiles
    {
        

        public List<Entidades.Seguridad.Perfil> ColPerfiles;

        public CatalogoPerfiles()
        {
            ColPerfiles = Mapping.Seguridad.MappingPerfiles.ConsultarPerfiles();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> ListarPerfiles()
        {
            return ColPerfiles.AsReadOnly();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> ListarPerfiles(Entidades.Seguridad.Grupo oGrupo, Entidades.Seguridad.Formulario oFormulario, Entidades.Seguridad.Permiso oPermiso)
        {
            var query = from per in ColPerfiles select per;

            if (oGrupo.IdGrupo != "TODOS")
            {
                query = query.Where(p => p.Grupo.IdGrupo == oGrupo.IdGrupo);
            }
            if (oFormulario.Nombre != "TODOS")
            {
                query = query.Where(p => p.Formulario.IdFormulario == oFormulario.IdFormulario);
            }
            if (oPermiso.Nombre != "TODOS")
            {
                query = query.Where(p => p.Permiso.Nombre == oPermiso.Nombre);
            }
            
            return query.ToList().AsReadOnly();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> ListarPerfiles(string grupo, string formulario, string permiso)
        {
            var query = from per in ColPerfiles select per;

            if (grupo != "TODOS")
            {
                query = query.Where(p => p.Grupo.IdGrupo == grupo);
            }
            if (formulario != "TODOS")
            {
                query = query.Where(p => p.Formulario.IdFormulario == formulario);
            }
            if (permiso != "TODOS")
            {
                query = query.Where(p => p.Permiso.IdPermiso == permiso);
            }

            return query.ToList().AsReadOnly();
        }



        public bool AgregarPerfil(Entidades.Seguridad.Perfil oPerfil)
        {
            ColPerfiles.Add(oPerfil);
            return Mapping.Seguridad.MappingPerfiles.AgregarPerfil(oPerfil);
        }

        public bool EliminarPerfil(Entidades.Seguridad.Perfil oPerfil)
        {
            ColPerfiles.RemoveAll(oPer => oPer.Grupo.IdGrupo == oPerfil.Grupo.IdGrupo 
                                  && oPer.Formulario.IdFormulario == oPerfil.Formulario.IdFormulario
                                  && oPer.Permiso.Nombre == oPerfil.Permiso.Nombre); 
            return Mapping.Seguridad.MappingPerfiles.EliminarPerfil(oPerfil);
        }

        public Entidades.Seguridad.Perfil BuscarPerfil(Entidades.Seguridad.Grupo oGrupo, Entidades.Seguridad.Formulario oFormulario, Entidades.Seguridad.Permiso oPermiso)
        {
            return this.ColPerfiles.Find(oPer => oPer.Grupo.IdGrupo == oGrupo.IdGrupo
                                  && oPer.Formulario.IdFormulario == oFormulario.IdFormulario
                                  && oPer.Permiso.Nombre == oPermiso.Nombre);
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> RecuperarPerfilesGrupos(Entidades.Seguridad.Usuario _Usuario)
        {
            List<Entidades.Seguridad.Perfil> colPerfiles = new List<Entidades.Seguridad.Perfil>();
            foreach (Entidades.Seguridad.Grupo grupo in _Usuario.Grupos)
            {
                colPerfiles.AddRange(ColPerfiles.FindAll(delegate(Entidades.Seguridad.Perfil perfil) { return perfil.Grupo.IdGrupo == grupo.IdGrupo; }));             
            }
            return colPerfiles.AsReadOnly();
        }

        public ReadOnlyCollection<Entidades.Seguridad.Perfil> RecuperarPerfilesGrupos(List<Entidades.Seguridad.Grupo> _grupos,string formulario)
        {
            List<Entidades.Seguridad.Perfil> colPerfiles = new List<Entidades.Seguridad.Perfil>();

            foreach (Entidades.Seguridad.Grupo grupo in _grupos)
            {
                colPerfiles.AddRange(ColPerfiles.FindAll(delegate(Entidades.Seguridad.Perfil perfil) { return perfil.Grupo.IdGrupo == grupo.IdGrupo && perfil.Formulario.Nombre == formulario; }));
            }
            return colPerfiles.AsReadOnly();
        }

        public bool ValidarPerfilPorFormulario(Entidades.Seguridad.Formulario oFormulario)
        {
            var query = (from per in ColPerfiles
                        where per.Formulario.IdFormulario == oFormulario.IdFormulario
                        select per).Count();

            if (query > 0)
            {
                return false;
            }
            return true;
        }

        public bool ValidarPerfilGrupo(Entidades.Seguridad.Grupo oGrupo)
        {
            var query = (from per in ColPerfiles
                         where per.Grupo.IdGrupo == oGrupo.IdGrupo
                         select per).Count();

            if (query > 0)
            {
                return false;
            }
            return true;
        }

        public bool ValidarPermisoPerfil(Entidades.Seguridad.Permiso oPermiso)
        {
            var query = (from per in ColPerfiles
                         where per.Permiso.IdPermiso == oPermiso.IdPermiso
                         select per).Count();

            if (query > 0)
            {
                return false;
            }
            return true;
        }


    }
}
